package com.book.anno;

import java.lang.reflect.Field;
import java.util.ArrayList;

/**
 * @author SuperYu  2024/8/13
 */
public class ParseSql {

    public static <T> String createInsertSql(T t) throws IllegalAccessException {
        StringBuffer sql = new StringBuffer("insert into ");
        // 得到表名：
        Class<?> aClass = t.getClass();
        boolean f = aClass.isAnnotationPresent(Table.class);
        if (f) {
            // 得到注解，得到名称。。。。
            Table table = aClass.getAnnotation(Table.class);
            String tableName = table.value();
            if ("".equals(tableName)) {
                // 如果没注解是没有写值，就以类名为表名
                tableName = aClass.getSimpleName();
            } else {
                // 否则就是写了值，以写了的为准
                tableName = tableName.trim();
            }
            // insert into admin (name, age, gender) values ()
            sql.append(tableName);

            // 得到属性：
            ArrayList<Field> list = new ArrayList<>();
            Field[] fields = aClass.getDeclaredFields();
            for (Field field : fields) {
                field.setAccessible(true);
                // 得到属性的值：
                Object value = field.get(t);
                // 排除掉默认值的情况
                if (value == null) {
                    continue;
                } else if (field.getType() == int.class && (int) value == 0) {
                    continue;
                } else if (field.getType() == double.class && (double) value == 0.0) {
                    continue;
                } else {
                    list.add(field);
                }
            }
            if(list.size() == 0){
                throw new RuntimeException("没有属性有值，无法生成sql!");
            }

            // 得到属性的值，拼接value的前面部份
            sql.append("(");

            for (int i = 0; i < list.size(); i++) {
                list.get(i).setAccessible(true);
                boolean ff = list.get(i).isAnnotationPresent(Column.class);
                boolean ff2 = list.get(i).isAnnotationPresent(Id.class);
                if (ff || ff2) {
                    // 得到属性的名字
                    String fieldName = list.get(i).getName();

                    // 把名字拼接进sql
                    if (i == list.size() - 1) {
                        sql.append(fieldName);
                    } else {
                        sql.append(fieldName + ",");
                    }
                }
            }
            sql.append(") values (");
            // 拼接值部份
            for (int i = 0; i < list.size(); i++) {
                list.get(i).setAccessible(true);
                boolean ff = list.get(i).isAnnotationPresent(Column.class);
                boolean ff2 = list.get(i).isAnnotationPresent(Id.class);
                if (ff || ff2) {
                    // 得到属性的名字
                    String fieldName = list.get(i).getName();
                    // 得到属性的类型
                    Class<?> type = list.get(i).getType();
                    //  得到属性的值：
                    Object value = list.get(i).get(t);

                    // 再把值拼接进sql
                    if(i == list.size() - 1){
                        if(type == int.class){
                            sql.append( value );
                        }else {
                            sql.append("'"+ value+"'" );
                        }

                    }else {
                        if(type == int.class){
                            sql.append( value+" , " );
                        }else {
                            sql.append("'"+ value+"' , " );
                        }
                    }
                }
            }
            sql.append(")");

        } else {
            new RuntimeException("该类上没有使用Table注解，无法得到表名，无法生成sql!");
        }


        return sql.toString();
    }

}
